package zz.fanshe;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.lang.reflect.Field;
import java.util.List;

public class MyClassPathXmlApplicationContext {
    private String xmlName;

    public MyClassPathXmlApplicationContext(String xmlName) {
        this.xmlName=xmlName;
    }

    public Object getBean(String id) {
        Object obj=null;            //声明引用.
        //进行xml的解析
        SAXReader reader=new SAXReader();
        try {
            Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(xmlName));
            Element root=document.getRootElement();
            //遍历.看是否有元素的id为传入的参数.
            List<Element> elements = root.elements();
            if(elements.size()>0) {
                for(Element element:elements ) {
                    if(element.attributeValue("id").equals(id)) {//id相同开始创建对象
                        //采用反射创建对象.
                        String className=element.attributeValue("class");
                        Class beanClass=Class.forName(className);
                        obj=beanClass.newInstance();
                        //获取子标签的属性.
                        List<Element> attributes=element.elements();
                        if(attributes.size()>0) {
                            for(Element attribute:attributes) {
                                String name=attribute.attributeValue("name");
                                Field field = beanClass.getDeclaredField(name);
                                field.setAccessible(true);
                                if(attribute.attribute("ref")!=null) {
                                    //此属性的值是一个对象.这里由于直接调用getBean方法赋值给对象,返回的对象一定是Bean参数的对象,因此强制转换不会出问题
                                    String refid=attribute.attributeValue("ref");
                                    field.set(obj, getBean(refid));
                                }
                                else {
                                    //此属性值是一个字符串.这里单独处理int,float类型变量.如果不处理,会将String类型直接赋值给int类型,发生ClassCastException
                                    String value=attribute.attributeValue("value");
                                    //需要对类型进行判断
                                    if(value.matches("[0-9]+")) {
                                        //整数
                                        int x=Integer.parseInt(value);
                                        field.set(obj, x);
                                        continue;
                                    }
                                    if(value.matches("[0-9]*(\\.+)[0-9]*")) {
                                        //浮点数
                                        float y=Float.parseFloat(value);
                                        field.set(obj, y);  //注意double可以接受float类型
                                        continue;
                                    }
                                    field.set(obj, value);//处理String类型
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }

}